package com.bicon.botu.mall.goods.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.bicon.botu.mall.goods.dto.OrderVerifyDto;
import com.bicon.botu.mall.goods.dto.ProductRepertoryIdListDto;
import com.bicon.botu.mall.goods.vo.*;
import com.bicon.botu.core.dto.GlobalSearchDTO;
import com.bicon.botu.mall.goods.entity.Product;
import com.bicon.botu.mall.goods.entity.ProductRepertory;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author 孙永刚
 * @since 2017-07-19
 */
public interface IProductService extends IService<Product> {


    /**
     * 添加商品
     *
     * @param productType   商品类型 非定制  定制
     * @param classfily     分类Id
     * @param brandId       品牌Id
     * @param supplier      供货商
     * @param buyingPrice   进货价
     * @param productName   商品名
     * @param description   描述
     * @param lable         标签
     * @param details       详细描述
     * @param weight        重量
     * @param noticeNum     警告数量
     * @param upShelves     是否上架
     * @param isProduct     是否作为商品
     * @param isFreeFreight 是否免运费
     * @param logisticsType 物流商
     * @param productAttr   产品skujson
     * @param productRegion 产品销售区域
     * @param isOnBefore    是否启用前身文字
     * @param isOnAfter     是否启用后身文字定义
     * @param beforeText    前身文字
     * @param afterText     后身文字
     * @param traceElement  是否启用微量元素自定义
     * @param element       微量元素json
     * @param saveOrUpdate  操作类型
     * @param productId     商品Id
     * @param productCode   商品编号
     * @return
     */
    Boolean addProductInfo(String classfily, String description, String isFreeFreight, String isProduct, String lable, String logisticsType,
                           Integer noticeNum, String productName, String productType, String upShelves, String supplier, double weight, String details,
                           String brandId, String productRegion, String isOnBefore, String isOnAfter, Integer beforeText, Integer afterText, String traceElement,
                           String saveOrUpdate, String productId, String productAttr, String element, String productCode, BigDecimal buyingPrice, String pictureStr);


    /**
     * 分页获取商品列表
     *
     * @param page
     * @param map
     * @return
     */
    Page getProductList(Page<ProductListVo> page, Map<String, Object> map);

    /**
     * 批量操作
     *
     * @param ids
     * @param opertion
     */
    void batchOpertion(String ids, String opertion);

    /**
     * 查询最大价格和最小价格
     *
     * @param map
     * @return
     */
    ProductPriceVo getMaxPriceAndMinPrice(Map<String, Object> map);

    /**
     * 查询删除或下架的商品中是否包含展示商品
     *
     * @param list
     * @return
     */
    Integer searchChannelGoods(List<String> list);

    /**
     * 查询删除或下架的商品中是否包含展示商品
     *
     * @param goodId
     * @return
     */
    Integer searCarefullyGoods(String goodId);

    /**
     * 为全局搜索提供商品列表表数据
     *
     * @param page
     * @param map
     * @return
     */
    Page<GlobalSearchDTO> getProductListForRpc(Page<GlobalSearchDTO> page, Map<String, Object> map);

    /**
     * 根据商品名称搜索商品
     *
     * @param page
     * @param map
     * @return
     */
    List<ProductDrugVo> selectProductList(Page<ProductDrugVo> page, Map<String, Object> map);

    /**
     * 根据商品id查询物流信息
     *
     * @param productId 商品id
     * @return
     */
    LogisticsCenterDto selectLogisticsCenter(String productId);


    /**
     * 根据商品名称查询列表(医疗)
     *
     * @param productName
     * @return
     */
    List<DrugPriceVo> findByProductName(String productName);

    Boolean addRepertoryInfo(String productAttr, String saveOrUpdate, String productId, String productName);

    BigDecimal getProductMinPrice(List<ProductRepertory> list);

    void cacheProductInfo(Product product, String picture);

    /**
     * 查询库存信息
     *
     * @param productRepertoryIdList 多个商品库存id
     * @return
     */

    List<ProductRepertoryIdListDto> selectProductRepertory(List<String> productRepertoryIdList);

    /**
     * 根据商品信息验证商品
     *
     * @param verifyDtoListJson 多个商品库存
     * @return
     */
    Boolean verifyProduct(String verifyDtoListJson);

    /**
     * 商品上下架统计
     * @return
     */
    List<Map<Integer,Object>> shelvesTotal();

//    /**
//     * 减少商品库存
//     *
//     * @param verifyDtoList 多个商品库存
//     * @return
//     */
//    Boolean reduceProduct(List<OrderVerifyDto> verifyDtoList);

    /**
     * 统计上架 、 下架 、 商品缺货 、 库存警告 、 评论未处理数量
     * @return
     */
    Map<String,Object> goodsStatistic();

}
